/* 
在javaScript中是没有枚举的概念的TS帮我们定义了枚举这个类型

使用枚举 通过enum关键字定义我们的枚举
*/


// 1.数字枚举
// 之前旧的用例
const enumeFn = (type: any) => {
  if(type === 'red') {
    return 0
  }
  if (type === 'green') {
    return 1
  }
  if (type === 'blue') {
    return 2
  }
}

let enumeObj = {
  'red': 0,
  'green': 1,
  'blue': 2
}

// 新的用例
enum Color {
  red,
  green,
  blue
}

console.log(Color['red'])
console.log(Color['green'])
console.log(Color['blue'])

// 增长枚举（仅适用于数字枚举）
enum Color02 {
  red = 1,
  green,
  blue
}

console.log(Color02['red'])
console.log(Color02['green'])
console.log(Color02['blue'])

// 2.字符串枚举
/* 
应用场景是：属性的可读性
*/
enum Color03 {
  yellow = 'yellow',
  pink = 'pink',
  white = 'white'
}

console.log(Color03['yellow'])
console.log(Color03['pink'])
console.log(Color03['white'])

// 3.异构枚举
/* 
枚举可以混合字符串和数字成员
*/
enum dicState {
  yes = 1,
  no = "false"
}

console.log(dicState['yes'])
console.log(dicState['no'])

// 4.接口枚举
interface enumA {
  red: dicState.yes
}

let enumObj:enumA = {
  red: dicState.yes
}

// 5.const枚举
/* 
const 在编译的时候是直接编译成常量
*/
const enum resCode {
  success,
  error
}

let resCodeValue: number = 0

if(resCodeValue === resCode.success) {
  console.log('请求成功')
}

// 6.反向映射
/* 
它包含了正向映射（ name -> value）和反向映射（ value -> name）

要注意的是 不会为字符串枚举成员生成反向映射。
*/

enum resCode02 {
  success,
  error
}

let successCode: number = resCode02.success
console.log(successCode)

let key = resCode02[successCode]
console.log(key)
